package cn.agrael.util;

/**
 * 字符串工具类。
 * 
 * @author <a href="mailto:agraellee@gmail.com">Agrael·Lee</a>
 * 
 */
public class StringUtils {

	private StringUtils() {
	}

	/**
	 * 将一个字符串指定位置的字符变为大写。
	 * 
	 * @param str 字符串。
	 * @param index 指定位置,该数必须大于等于1,小于等于字符串长度。
	 * @return 改变后的字符串。
	 */
	public static String toUpperCase(String str, int index) {
		StringBuilder sb = new StringBuilder(str);
		char s = Character.toUpperCase(sb.charAt(index - 1));
		sb.setCharAt(index - 1, s);
		return sb.toString();
	}

	/**
	 * 将一个字符串指定位置的字符变为小写。
	 * 
	 * @param str 字符串。
	 * @param index 指定位置,该数必须大于等于1,小于等于字符串长度。
	 * @return 改变后的字符串。
	 */
	public static String toLowerCase(String str, int index) {
		StringBuilder sb = new StringBuilder(str);
		char s = Character.toLowerCase(sb.charAt(index - 1));
		sb.setCharAt(index - 1, s);
		return sb.toString();
	}

	/**
	 * 将参数转换为 {@link String} 。 如果 param 为 null 则返回 null 。如果参数为 {@link String}
	 * 类型则直接转换为 {@link String} ，否则调用参数的 {@link Object#toString()} 方法转换为
	 * {@link String} 。
	 * 
	 * @param param 要转换的参数。
	 * @return 转换后的参数。
	 */
	public static String toString(Object param) {
		if (param == null) {
			return null;
		}
		if (param instanceof String) {
			return (String) param;
		}
		return param.toString();
	}

	/**
	 * 判断string是否为空。
	 * 
	 * @param string 要判断的String。
	 * @return 如果String为 null 或者 {@link String#trim()} 为 "" ，则返回 true。
	 */
	public static boolean isEmpty(String string) {
		return (string == null) || ("".equals(string.trim()));
	}

	/**
	 * 检查 string 是否为空，如果为空则使用 defaultValue 作为返回值。
	 * 
	 * @param string 要检查的 String。
	 * @param defaultValue 如果 string 为空时的默认值。
	 * @return string 不为空返回 string ，否则返回 defaultValue。
	 */
	public static String checkEmptyString(String string, String defaultValue) {
		if (isEmpty(string)) {
			return defaultValue;
		}
		return string;
	}

	/**
	 * 判断String是否有内容。
	 * 
	 * @param string 要判断的String。
	 * @return 当 String 不为 null 与 {@link String#length()} > 0 时返回 true。
	 */
	public static boolean hasLength(String string) {
		return (string != null && string.length() > 0);
	}
}